package com.csw.shuanfa.CodeImprove.designPattern;


/**
 * 抽象工厂
 */
public class AbstractFactoryD {
    /**
     * @param args
     */
    public static void main(String[] args) {
        AbstractFactory factory1 = new Factory1();
        AbstractProductA productA1 = factory1.createProductA();
        AbstractProductB productB1 = factory1.createProductB();
        productA1.use();
        productB1.consume();

        AbstractFactory factory2 = new Factory2();
        AbstractProductA productA2 = factory2.createProductA();
        AbstractProductB productB2 = factory2.createProductB();
        productA2.use();
        productB2.consume();
    }

}


/**
 * 定义抽象类
 */
interface AbstractProductA {
    void use();
}

interface AbstractProductB {
    void consume();
}

/**
 * 定义抽象工厂类
 */
interface AbstractFactory {
    AbstractProductA createProductA();

    AbstractProductB createProductB();
}

/**
 * 定义具体产品类
 */
class ProductA1 implements AbstractProductA {

    @Override
    public void use() {
        System.out.println("使用ProductA1");
    }
}

class ProductA2 implements AbstractProductA {

    @Override
    public void use() {
        System.out.println("使用产品A2");
    }
}

class ProductB1 implements AbstractProductB {

    @Override
    public void consume() {
        System.out.println("消费ProductB1");
    }
}

class ProductB2 implements AbstractProductB {

    @Override
    public void consume() {
        System.out.println("消费产品B2");
    }
}

/**
 * 定义具体工厂类
 */
class Factory1 implements AbstractFactory {

    @Override
    public AbstractProductA createProductA() {
        return new ProductA1();
    }

    @Override
    public AbstractProductB createProductB() {
        return new ProductB1();
    }
}

class Factory2 implements AbstractFactory {

    @Override
    public AbstractProductA createProductA() {
        return new ProductA2();
    }

    @Override
    public AbstractProductB createProductB() {
        return new ProductB2();
    }
}